# 4.10 运动物体检测

## 4.10.1 算法简介

Sengo2静止不动，算法通过对比相邻帧的像素差异，来判断图像中是否有发生变化的区域，如果有则认为视野内存在运动物体，返回该区域的坐标信息。 算法只返回一个检测结果。

## 4.10.2 返回数据

主控器获取识别结果时，算法会返回以下数据：

|  结果   |      含义       |
| :-----: | :-------------: |
| kXValue | 物体中心横坐标x |
| kYValue | 物体中心纵坐标y |

代码：

```python
            x = sengo2.GetValue(sengo2_vision_e.kVisionMotionDetect, sentry_obj_info_e.kXValue, i)
            y = sengo2.GetValue(sengo2_vision_e.kVisionMotionDetect, sentry_obj_info_e.kYValue, i)
```

----------------

## 4.10.3 代码

```python
from machine import I2C,UART,Pin
from  Sengo2  import *
import time

# 等待Sengo2完成操作系统的初始化。此等待时间不可去掉，避免出现Sengo2尚未初始化完毕主控器已经开发发送指令的情况
time.sleep(2)

# 选择UART或者I2C通讯模式，Sengo2出厂默认为I2C模式，短按模式按键可以切换
# 4种UART通讯模式：UART9600（标准协议指令），UART57600（标准协议指令），UART115200（标准协议指令），Simple9600（简单协议指令），
#########################################################################################################
# port = UART(2,rx=Pin(16),tx=Pin(17),baudrate=9600)
port = I2C(0,scl=Pin(21),sda=Pin(20),freq=400000)

# Sengo2通讯地址：0x60。如果I2C总线挂接多个设备，请避免出现地址冲突
sengo2 = Sengo2(0x60)

err = sengo2.begin(port)
print("sengo2.begin: 0x%x"% err)

 
# 1、算法介绍参考
# 2、使用时需要固定好sengo2，避免晃动，出现误报；
# 3、正常使用时，应由主控器发送指令控制Sengo2算法的开启与关闭，而非通过摇杆手动进行操作；
err = sengo2.VisionBegin(sengo2_vision_e.kVisionMotionDetect)
print("sengo2.VisionBegin(sengo2_vision_e.kVisionMotionDetect):0x%x"% err)

while True:
    # Sengo2不主动返回检测识别结果，需要主控板发送指令进行读取。读取的流程：首先读取识别结果的数量，接收到指令后，Sengo2会刷新结果数据，如果结果数量不为零，那么主控再发送指令读取结果的相关信息。请务必按此流程构建程序。
    obj_num = sengo2.GetValue(sengo2_vision_e.kVisionMotionDetect, sentry_obj_info_e.kStatus)
    if obj_num:
        print("Totally %d moving object: "%( obj_num ))
        for i in range(1,obj_num+1):
            x = sengo2.GetValue(sengo2_vision_e.kVisionMotionDetect, sentry_obj_info_e.kXValue, i)
            y = sengo2.GetValue(sengo2_vision_e.kVisionMotionDetect, sentry_obj_info_e.kYValue, i)
            # 结果的w与h值为固定值，无实际意义，故无需读取处理
            print("object%d: x=%d, y=%d"%(i, x, y))
            time.sleep(0.2)
            print("\n")

```

-----

## 4.10.4 代码结果

上传代码后，AI视觉模块将会对摄像头拍到的地方进行识别，如果有识别到有物体在运动则会进行捕捉并且会在串口监视器中打印识别到的运动物体的在屏幕中显示的位置xy坐标以及宽度和高度。

![b16](./media/b16.gif)

![](./media/b12.png)

## 4.10.5 扩展玩法

**动态感应灯**

- **玩法简介：** 将模块对准房间门口或走廊。当检测到有较大范围的运动（有人经过）时，自动点亮LED灯，并延时熄灭，实现“人来灯亮，人走灯灭”。
- **实现：** 编程持续检测运动物体。一旦检测到，则触发数字引脚输出高电平，控制继电器或MOS管点亮灯带。